package controllers

import (
	"myproject/models"

	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
)

type UserController struct {
	beego.Controller
}

func (uc *UserController) ShowLogin() {
	uc.TplName = "login.html"
}

func (uc *UserController) HandleLogin() {
	userName := uc.GetString("username")
	password := uc.GetString("password")
	if userName == "" || password == "" {
		beego.Info("用户民或密码不能为空")
		uc.TplName = "login.html"
		return
	}
	// 判断数据库是否存在该用户
	o := orm.NewOrm()
	user := models.User{}

	user.UserName = userName
	err := o.Read(&user, "UserName")
	if err != nil {
		beego.Info("用户名不存在")
		uc.TplName = "login.html"
		return
	}

	if 	user.Password != password {
		beego.Info("密码不正确")
		uc.TplName = "login.html"
		return
	}
	
	uc.Redirect("/admin", 302)
}

func (uc *UserController) ShowRegister() {
	uc.TplName = "register.html"
}

func (uc *UserController) HandleRegister() {
	userName := uc.GetString("username")
	password := uc.GetString("password")
	if userName == "" || password == "" {
		beego.Info("用户名或密码不能为空")
		uc.TplName = "register.html"
		return
	}

	o := orm.NewOrm()
	user := models.User{}
	user.UserName = userName
	user.Password = password

	// 插入数据到数据库
	_, err := o.Insert(&user)
	if err != nil {
		beego.Info("注册失败", err)
		return
	}
	
	// 注册成功，返回登录页面，用户可以登录
	uc.Redirect("/", 302)
}

/*
请求转发: 指定 TplName;
重定向: 指定 Redirect;

区别：
1、请求次数：重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求，转发是服务器收到请求后为了完成响应跳转到一个新的地址；重定向至少请求两次，转发请求一次；
2、地址栏不同：重定向地址栏会发生变化，转发地址栏不会发生变化；
3、是否共享数据：重定向两次请求不共享数据，转发一次请求共享数据（在request级别使用信息共享，使用重定向必然出错）；
4、跳转限制：重定向可以跳转到任意URL，转发只能跳转本站点资源；
5、发生行为不同：重定向是客户端行为，转发是服务器端行为；

使用：
1、可以利用request的域对象的特点，由源组件向其中存放写数据；
2、重定向的速度比转发慢，因为浏览器还得发出一个新的请求，所以如果在使用转发和重定向都无所谓的时候建议使用转发；
3、因为转发只能访问当前WEB的应用程序，所以不同WEB应用程序之间的访问，特别是要访问到另外一个WEB站点上的资源的情况，这个时候就只能使用重定向了。
*/